//package com.diaohw.module.metadata.service.meta;
//
//import cn.hutool.core.util.ObjUtil;
//import cn.hutool.core.util.StrUtil;
//import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
//import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
//import com.baomidou.mybatisplus.core.toolkit.Wrappers;
//import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
//import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
//import com.diaohw.module.metadata.mapper.MetaItemMapper;
//import com.diaohw.module.metadata.mapper.MetaMapper;
//import com.diaohw.module.metadata.mapper.MetaVersionMapper;
//import com.diaohw.module.metadata.obj.Status;
//import com.diaohw.module.metadata.obj.convert.MetaItemConvert;
//import com.diaohw.module.metadata.obj.dto.MetaDTO;
//import com.diaohw.module.metadata.obj.dto.MetaItemDTO;
//import com.diaohw.module.metadata.obj.entity.MetaDO;
//import com.diaohw.module.metadata.obj.entity.MetaItemDO;
//import com.diaohw.module.metadata.obj.entity.MetaVersionDO;
//import com.diaohw.module.metadata.obj.query.MetaItemQuery;
//import com.diaohw.module.metadata.obj.query.MetaQuery;
//import com.diaohw.module.metadata.obj.vo.MetaItemVO;
//import com.diaohw.module.metadata.obj.vo.MetaVO;
//import com.diaohw.module.metadata.service.MetaService;
//import com.diaohw.platform.common.enums.CodeMsgEnum;
//import com.diaohw.platform.common.obj.page.PageResultVo;
//import com.diaohw.platform.framework.db.obj.BaseModel;
//import com.diaohw.platform.framework.db.utils.DataCheckUtils;
//import com.diaohw.platform.framework.db.utils.WrapperUtils;
//import com.diaohw.platform.framework.redis.util.RedisHashUtil;
//import jakarta.annotation.Resource;
//import org.springframework.stereotype.Service;
//
//import java.util.ArrayList;
//import java.util.HashMap;
//import java.util.List;
//import java.util.Map;
//import java.util.stream.Collectors;
//
///**
// * <p>
// * 元数据信息 服务实现类
// * </p>
// *
// * @author D-Hw
// * @since 2025-04-07
// */
//@Service
//public class MetaImpl extends ServiceImpl<MetaMapper, MetaDO> implements MetaService {
//
//    @Resource
//    private MetaVersionMapper versionMapper;
//    @Resource
//    private MetaItemMapper itemMapper;
//
//    @Override
//    public Boolean create(MetaDTO data) {
//
//        DataCheckUtils.eq(MetaDO::getName, data.getName(), this.baseMapper);
//        DataCheckUtils.eq(MetaDO::getCode, data.getCode(), this.baseMapper);
//
//        String v = String.format("%d.%d.%d", year(), month(), day());
//
//        MetaDO model = INSTANCE.dtoToEntity(data);
//        model.setVersion(v);
//        model.setStatus(Status.SNAPSHOT);
//        MetaVO meta = INSTANCE.entityToVo(model);
//        RedisHashUtil.put(REDIS_META_VERSION, model.getId(), meta);
//
//        return this.save(model);
//    }
//
//    @Override
//    public Boolean update(String id, MetaDTO data) {
//
//        DataCheckUtils.eq(MetaDO::getId, id, MetaDO::getName, data.getName(), this.baseMapper);
//
//        LambdaUpdateWrapper<MetaDO> wrapper = Wrappers.<MetaDO>lambdaUpdate()
//                .eq(MetaDO::getId, id)
//                .set(MetaDO::getName, data.getName())
//                .set(MetaDO::getAlias, data.getAlias())
//                .set(MetaDO::getRemark, data.getRemark());
//
//        MetaVO vo = RedisHashUtil.itemVal(REDIS_META_VERSION, id);
//        vo.setName(data.getName());
//        vo.setAlias(data.getAlias());
//        vo.setRemark(data.getRemark());
//        RedisHashUtil.put(REDIS_META_VERSION, id, vo);
//
//        return this.update(wrapper);
//    }
//
//
//    @Override
//    public Boolean create(MetaItemDTO data) {
//        MetaVO vo = RedisHashUtil.itemVal(REDIS_META_VERSION, data.getMetaId());
//        long c1 = vo.getItems().stream().filter(item -> item.getItemName().equals(data.getItemName())).count();
//        long c2 = vo.getItems().stream().filter(item -> item.getItemCode().equals(data.getItemCode())).count();
//
//        if (c1 > 0) {
//            CodeMsgEnum.DATA.throwException(String.format("[%s]重复", data.getItemName()));
//        }
//
//        if (c2 > 0) {
//            CodeMsgEnum.DATA.throwException(String.format("[%s]重复", data.getItemCode()));
//        }
//
//        MetaItemVO item = MetaItemConvert.INSTANCE.toVo(data);
//        vo.pushItem(item);
//        item.setId(BaseModel.primaryKey(data));
//        RedisHashUtil.put(REDIS_META_VERSION, data.getMetaId(), vo);
//
//        return Boolean.TRUE;
//    }
//
//    @Override
//    public Boolean update(String id, MetaItemDTO data) {
//
//
//        MetaVO vo = RedisHashUtil.itemVal(REDIS_META_VERSION, data.getMetaId());
//        long c1 = vo.getItems().stream()
//                .filter(item -> !id.equals(item.getId()))
//                .filter(item -> item.getItemName().equals(data.getItemName())).count();
//        long c2 = vo.getItems().stream()
//                .filter(item -> !id.equals(item.getId()))
//                .filter(item -> item.getItemCode().equals(data.getItemCode())).count();
//
//        if (c1 > 0) {
//            CodeMsgEnum.DATA.throwException(String.format("[%s]重复", data.getItemName()));
//        }
//
//        if (c2 > 0) {
//            CodeMsgEnum.DATA.throwException(String.format("[%s]重复", data.getItemCode()));
//        }
//
//        MetaItemVO item = MetaItemConvert.INSTANCE.toVo(data);
//        vo.pushItem(item);
//        item.setId(BaseModel.primaryKey(data));
//        RedisHashUtil.put(REDIS_META_VERSION, data.getMetaId(), vo);
//
//        return Boolean.TRUE;
//    }
//
//
//    private MetaVO load(String itemId, boolean cache) {
//        MetaItemDO item = itemMapper.selectById(itemId);
//        MetaDO byId = this.getById(item.getId());
//        MetaVO metaVO = INSTANCE.entityToVo(byId);
//        return null;
//    }
//
//    @Override
//    public Boolean delete(String id) {
//        this.update(Wrappers.<MetaDO>lambdaUpdate().eq(MetaDO::getId, id).set(MetaDO::getStatus, Status.DELETE));
//        return this.removeById(id);
//    }
//
//    @Override
//    public MetaVO detail(String id) {
//
//        if (RedisHashUtil.existHashKey(REDIS_META_VERSION, id)) {
//            return RedisHashUtil.itemVal(REDIS_META_VERSION, id);
//        }
//
//        MetaDO model = this.getById(id);
//        List<MetaDO> list = List.of(model);
//        List<MetaVO> items = findItems(list, Boolean.TRUE);
//
//        return items.get(0);
//    }
//
//    @Override
//    public List<MetaVO> findByList(MetaQuery query) {
//        LambdaQueryWrapper<MetaDO> wrapper = createWrapper(query);
//        List<MetaDO> list = this.list(wrapper);
//        return findItems(list, query.isChildren());
//    }
//
//    @Override
//    public List<MetaItemVO> findByList(MetaItemQuery query) {
//        if (RedisHashUtil.existHashKey(REDIS_META_VERSION, query.getMetaId())) {
//            return items(query);
//        }
//
//        List<MetaItemDO> list = itemMapper.selectList(createWrapper(query));
//
//        return MetaItemConvert.INSTANCE.entityToVo(list);
//    }
//
//    @Override
//    public PageResultVo<MetaVO> findByPage(MetaQuery query) {
//        LambdaQueryWrapper<MetaDO> wrapper = createWrapper(query);
//        Page<MetaDO> page = this.page(WrapperUtils.createPage(query), wrapper);
//        return PageResultVo.create(page.getTotal(), findItems(page.getRecords(), query.isChildren()));
//    }
//
//    @Override
//    public PageResultVo<MetaItemVO> findByPage(MetaItemQuery query) {
//        if (RedisHashUtil.existHashKey(REDIS_META_VERSION, query.getMetaId())) {
//            List<MetaItemVO> items = items(query);
//            long skip = (long) (query.getPageIndex() - 1) * query.getPageSize();
//            List<MetaItemVO> list = items.stream().skip(skip).limit(query.getPageSize()).toList();
//            return PageResultVo.create(items.size(), list);
//        }
//
//        Page<MetaItemDO> selected = itemMapper.selectPage(WrapperUtils.createPage(query), createWrapper(query));
//
//        List<MetaItemVO> list = MetaItemConvert.INSTANCE.entityToVo(selected.getRecords());
//        return PageResultVo.create(selected.getTotal(), list);
//    }
//
//    private List<MetaVO> findItems(List<MetaDO> list, boolean children) {
//
//        if (!children) {
//            return INSTANCE.entityToVo(list);
//        }
//
//        List<MetaVO> rows = new ArrayList<>();
//
//        Map<String, MetaVO> map = new HashMap<>();
//
//        for (MetaDO meta : list) {
//            if (RedisHashUtil.existHashKey(REDIS_META_VERSION, meta.getId())) {
//                rows.add(RedisHashUtil.itemVal(REDIS_META_VERSION, meta.getId()));
//            } else {
//                map.put(meta.getId(), INSTANCE.entityToVo(meta));
//            }
//        }
//
//        List<MetaItemDO> items = itemMapper.selectList(Wrappers.<MetaItemDO>lambdaQuery().in(MetaItemDO::getMetaId, map.keySet()));
//
//        items.stream().map(MetaItemConvert.INSTANCE::entityToVo)
//                .collect(Collectors.groupingBy(MetaItemVO::getMetaId))
//                .forEach((id, values) -> map.get(id).setItems(values));
//
//
//        return rows;
//    }
//
//
//    private List<MetaItemVO> items(MetaItemQuery query) {
//        MetaVO meta = RedisHashUtil.itemVal(REDIS_META_VERSION, query.getMetaId());
//
//        return meta.getItems().stream()
//                .filter(it -> StrUtil.isBlank(query.getItemName()) || it.getItemName().contains(query.getItemName()))
//                .filter(it -> StrUtil.isBlank(query.getItemCode()) || it.getItemCode().contains(query.getItemCode()))
//                .filter(it -> query.getDataType() == null || it.getDataType() == query.getDataType())
//                .toList();
//    }
//
//    /**
//     * 生成查询条件
//     *
//     * @param query 查询条件
//     */
//    private LambdaQueryWrapper<MetaDO> createWrapper(MetaQuery query) {
//        LambdaQueryWrapper<MetaDO> wrapper = Wrappers.lambdaQuery(MetaDO.class);
//        wrapper.like(StrUtil.isNotBlank(query.getName()), MetaDO::getName, query.getName());
//        wrapper.like(StrUtil.isNotBlank(query.getCode()), MetaDO::getCode, query.getCode());
//        wrapper.like(StrUtil.isNotBlank(query.getAlias()), MetaDO::getAlias, query.getAlias());
//        wrapper.like(ObjUtil.isNotNull(query.getStatus()), MetaDO::getStatus, query.getStatus());
//        wrapper.like(StrUtil.isNotBlank(query.getVersion()), MetaDO::getVersion, query.getVersion());
//        wrapper.like(StrUtil.isNotBlank(query.getRemark()), MetaDO::getRemark, query.getRemark());
//        return wrapper;
//    }
//
//
//    /**
//     * 生成查询条件
//     *
//     * @param query 查询条件
//     */
//    private LambdaQueryWrapper<MetaItemDO> createWrapper(MetaItemQuery query) {
//        LambdaQueryWrapper<MetaItemDO> wrapper = Wrappers.lambdaQuery(MetaItemDO.class);
//        wrapper.like(StrUtil.isNotBlank(query.getMetaId()), MetaItemDO::getMetaId, query.getMetaId());
//        wrapper.like(StrUtil.isNotBlank(query.getMetaCode()), MetaItemDO::getMetaCode, query.getMetaCode());
//        wrapper.like(StrUtil.isNotBlank(query.getItemName()), MetaItemDO::getItemName, query.getItemName());
//        wrapper.like(StrUtil.isNotBlank(query.getItemCode()), MetaItemDO::getItemCode, query.getItemCode());
//        wrapper.like(StrUtil.isNotBlank(query.getRequired()), MetaItemDO::getRequired, query.getRequired());
//        wrapper.like(StrUtil.isNotBlank(query.getDefaultVal()), MetaItemDO::getDefaultVal, query.getDefaultVal());
//        wrapper.like(StrUtil.isNotBlank(query.getUnit()), MetaItemDO::getUnit, query.getUnit());
//        wrapper.like(StrUtil.isNotBlank(query.getRemark()), MetaItemDO::getRemark, query.getRemark());
//        return wrapper;
//    }
//
//    private MetaVersionDO getVersion(String id, String version) {
//        return versionMapper.selectOne(Wrappers.<MetaVersionDO>lambdaQuery()
//                .eq(MetaVersionDO::getTableId, id)
//                .eq(MetaVersionDO::getVersion, version));
//    }
//
//}
